package com.twb.log.queue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

import org.springframework.stereotype.Component;

import com.twb.log.entity.twbLogOperation.TwbLogOperation;

/**
 * @Title LogQueue.java
 * @Description 创建日志的存放队列
 * 
 * @author DSY
 * @date 2017年5月25日 下午2:37:07
 */
@Component("logQueue")
public class LogQueue {
	/*
	 * 当生产者往队列中放入一个数据时，队列会从生产者手中获取数据，并缓存在队列内部，而生产者立即返回；
	 * 只有当队列缓冲区达到最大值缓存容量时（LinkedBlockingQueue可以通过构造函数指定该值），才会阻塞生产者队列，
	 * 直到消费者从队列中消费掉一份数据，生产者线程会被唤醒，反之对于消费者这端的处理也基于同样的原理
	 * 
	 * TODO: 我们需要注意的是，如果构造一个LinkedBlockingQueue对象，而没有指定其容量大小，
	 * LinkedBlockingQueue会默认一个类似无限大小的容量（Integer.MAX_VALUE），
	 * 这样的话，如果生产者的速度一旦大于消费者的速度，也许还没有等到队列满阻塞产生，系统内存就有可能已被消耗殆尽了
	 */
	private BlockingQueue<TwbLogOperation> blockingQueue = new LinkedBlockingQueue<TwbLogOperation>();

	public void add(TwbLogOperation logOperation) {
		blockingQueue.add(logOperation);
	}

	/*
	 * 从BlockingQueue取出一个队首的对象，如果在指定时间内， 队列一旦有数据可取，则立即返回队列中的数据。否则直到时间超时还没有数据可取，返回失败
	 */
	public TwbLogOperation poll() throws InterruptedException {
		return blockingQueue.poll(1, TimeUnit.SECONDS);
	}
}
